//  this library.
import 'dart:convert';
import 'dart:io';

import 'package:aliplayer_widget/utils/snack_bar_util.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:hktk_app/dao/industry_dao.dart';
import 'package:hktk_app/dao/login_dao.dart';
import 'package:hktk_app/exception/dao_exception.dart';
import 'package:hktk_app/ienum/login/login_type_enum.dart';
import 'package:hktk_app/ienum/login/suc_return_enum.dart';
import 'package:hktk_app/model/login/config_model.dart';
import 'package:hktk_app/model/yidun/ios_config_model.dart';
import 'package:hktk_app/navigotr/tab_navigator.dart' show TabNavigator;
import 'package:hktk_app/pages/login/phone_page.dart';
import 'package:hktk_app/util/device_util.dart';
import 'package:hktk_app/util/screen_adapter_helper.dart';
import 'package:hktk_app/util/toast_util.dart';
import 'package:hktk_app/util/yidun_util.dart';
import 'package:quickpass_yidun_flutter/quickpass_flutter_plugin.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart';

/// 一键登录测试,     这是
class Automatic2Page extends StatefulWidget {
  /// 右上角关闭按钮是否是游客模式按钮，是的话直接跳转首页
  final bool closeVisitors;

  /// 登录后跳转的页面
  final Widget? onPage;
  final String pageName;

  /// 返回方式
  final SucReturnEnum sucReturn;

  const Automatic2Page({
    super.key,
    this.closeVisitors = true,
    this.onPage,
    this.sucReturn = SucReturnEnum.toHome,
    this.pageName = "/tab",
  });

  @override
  State<Automatic2Page> createState() => _Automatic2PageState();
}

class _Automatic2PageState extends State<Automatic2Page> {
  /// 一键登录控制器
  late QuickpassFlutterPlugin quickLoginPlugin;

  /// 一键登录监听器
  var eventChannel = const EventChannel("yd_quicklogin_flutter_event_channel");

  /// 登录token
  String _accessToken = "";

  /// 易盾token
  String _ydToken = "";

  /// 上下文控制器
  late BuildContext _context;

  /// 是否是手动关闭授权页
  bool _closeManual = false;

  /// 一键登录成功key值
  final String _successKey = "success";

  /// 是否是第一次运行
  late bool _init;

  ConfigModel? _configModel;

  @override
  void initState() {
    super.initState();

    quickLoginPlugin = QuickpassFlutterPlugin();
    // 监听广播通知
    eventChannel.receiveBroadcastStream().listen(_onData);
    _init = true;
    // 初始化获取设备信息id
    DeviceUtil.deviceInit();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    _context = context;
    // 注意：这里不能用 MediaQuery.of(context) 获取宽高，
    // 要不然会导致进入PhonePage页面后，PhonePage页面刷新(build)这里也刷新(build)，
    // 导致PhonePage页面输入时弹出一键登录页面
    return Scaffold(
      body: FutureBuilder<Map<String, dynamic>>(
        future: _preloading(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          // return const Center(
          //   child: CircularProgressIndicator(),
          // );
          // 请求已结束
          // return Container();

          if (snapshot.connectionState == ConnectionState.done) {
            Map<String, dynamic> data = snapshot.data;
            // 执行内部的回调函数，避免跳转页面报错
            WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
              if(mounted){
                if (!data["success"]) {
                  // 获取key失败，退出
                  if(Platform.isIOS){
                    // exit(0);
                    Navigator.pop(context);
                  }else{
                    SystemNavigator.pop();
                  }
                } else {
                  if (data["yjdl"]) {
                    // 成功，拉起授权页
                    _loadPage();
                  }
                }
              }
            });
            if (data["success"] && !data["yjdl"]) {
              return PhonePage(
                  appConfig: _configModel!.appConfig!,
                  closeVisitors: widget.closeVisitors,
                  sucReturn: widget.sucReturn,
                  onPage: widget.onPage);
            }
            // 成功，拉起授权页
            return Container();
          } else {
            // 请求未结束，显示loading，加载中
            return const Center(
              child: CircularProgressIndicator(),
            );
          }
        },
      ),
    );
  }

  /// 预加载方法
  /// 修改，在这个方法里完成初始所有异步操作
  Future<Map<String, dynamic>> _preloading() async {
    Map<String, dynamic> map = {};
    try {
      // 是否是第一次加载
      if (_init) {
        // 判断是否是iOS，是的话请求网络权限
        // if (Platform.isIOS) {
        //   bool iosRes = await _requestPermissions();
        //   if (!iosRes) {
        //     return {"success": false, "yjdl": false};
        //   }
        // }

        // 获取后端返回的数据，key和url
        _configModel = await LoginDao.config();
        if (_configModel == null) {
          return {"success": false, "yjdl": false, "msg": "_configModel == null"};
        }
        // 首先判断是否支持一键登录，不支持则直接跳转验证码登录
        var bool1 = await isVerifyEnable();
        if (!bool1) return {"success": true, "yjdl": false};
        // 初始化
        var bool2 = await isInitSuccess(_configModel!.yidun!.businessId!);
        if (!bool2) return {"success": true, "yjdl": false};
        _init = false;
      }
      // 预取号
      var bool3 = await preLogin();
      if (!bool3) return {"success": true, "yjdl": false};
      // 自定义授权页面
      await custom(_configModel!.appConfig!);
      return {"success": true, "yjdl": true};
    } catch (e) {

      // map = {"success": false, "yjdl": false, "msg": e.toString()};
      map = {"success": false, "yjdl": false, "msg": "未知错误，请重试"};
      if (e is DaoException) {
        map["msg"] = e.msg;
      }
    }
    return map;
  }

  /// 加载页面
  _loadPage() {
    /// 拉取授权页
    quickLoginPlugin.onePassLogin().then((map) {
      if (map?[_successKey]) {
        _accessToken = map?["accessToken"];
        _login();
      } else {
        var errorMsg = map?["msg"];
        _pushPhone(tipsMsg: "取号失败，请重试");
      }
    });
  }

  /// 是否具备一键登录能力
  Future<bool> isVerifyEnable() async {
    bool result = false;
    await quickLoginPlugin.checkVerifyEnable().then((map) {
      result = map?[_successKey];
    });
    return result;
  }

  /// sdk 初始化是否完成
  Future<bool> isInitSuccess(String initKey) async {
    Map? map = await quickLoginPlugin.init(initKey, 4);
    return map?[_successKey] ?? false;
  }

  /// 预取号
  Future<bool> preLogin() async {
    bool res = false;
    Map? map = await quickLoginPlugin.preFetchNumber();
    if (map?[_successKey] == true) {
      _ydToken = map?['token'];
      res = true;
    }
    return res;
  }

  /// 检查网络状态方法
  Future<bool> _requestPermissions() async {
    return true;
  }

  /// 自定义授权页面
  custom(AppConfig appConfig) async {
    Map<String, dynamic> configMap;
    Map<String, dynamic> config = {};
    if (Platform.isIOS) {
      // String file = "assets/android-light-config.json";
      // ios 处理
      IosConfigModel iosConfig = getIosConfig();
      // 用户协议url
      iosConfig.appFPrivacyURL = appConfig.yhxy;
      // 隐私协议url
      iosConfig.appSPrivacyURL = appConfig.ysxy;
      // 计算一些高度
      double ykdlTop = iosConfig.widgets![2].frame!.mainScreenTopDistance!;
      iosConfig.widgets![2].frame!.mainScreenTopDistance =
          ykdlTop + ScreenUtil().statusBarHeight;
      double xybottom = iosConfig.appPrivacyOriginBottomMargin!;
      iosConfig.appPrivacyOriginBottomMargin =
          xybottom + ScreenUtil().bottomBarHeight;
      // 获取对应的map
      config = iosConfig.toJson();
    } else if (Platform.isAndroid) {
      // android 处理
      // 获取对应的页面
      String file = "assets/android-light-config.json";
      // 加载json数据
      var value = await rootBundle.loadString(file);
      var decode = json.decode(value);
      // 用户协议url
      decode["protocolLink"] = appConfig.yhxy;
      // 隐私协议url
      decode["protocol2Link"] = appConfig.ysxy;
      config = decode;
    }
    configMap = {"uiConfig": config};
    // 自定义授权页面
    quickLoginPlugin.setUiConfig(configMap);
  }

  /// 监听方法
  void _onData(event) {
    if (event is Map) {
      var action = event["action"];
      if (action == "authViewDidLoad") {
        // debugPrint("automatic2Page 页面 -> 监听方法：正在加载授权页 ===> ");
      } else if (action == "authViewWillAppear") {
        // debugPrint("automatic2Page 页面 -> 监听方法：授权页已经出现 ===> ");
      } else if (action == "authViewWillDisappear") {
        // debugPrint("automatic2Page 页面 -> 监听方法：授权页将要消失 ===> $_closeManual");
        if (_closeManual) {
          _closeManual = false;
        } else {
          // 退出app
          // SystemNavigator.pop();
        }
      } else if (action == "authViewDidDisappear") {
        // debugPrint("automatic2Page 页面 -> 监听方法：授权页已经消失 ===> ");
      } else if (action == "authViewDealloc") {
        // debugPrint("automatic2Page 页面 -> 监听方法：授权页销毁 ===> ");
      } else if (action == "appDPrivacy") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了默认协议 ===> ");
      } else if (action == "appFPrivacy") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了议第一个协议点击 ===> ");
      } else if (action == "appSPrivacy") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了第二个协议 ===> ");
      } else if (action == "loginAction") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了登录按钮 ===> ");
      } else if (action == "checkedAction") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了复选框 ===> ");
      } else if (action == "loginWx") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了微信 ===> ");
      } else if (action == "loginBj") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了本机 ===> ");
        _checkBj();
      } else if (action == "loginPg") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了苹果 ===> ");
        _iosLogin();
      } else if (action == "loginYkfh") {
        // debugPrint("automatic2Page 页面 -> 监听方法：点击了游客返回 ===> ");
        _tourists();
      }
    }
  }

  /// 本机点击方法
  _checkBj() {
    // 关闭授权页
    quickLoginPlugin.closeLoginAuthView();
    _closeManual = true;
    // 跳转验证码登录
    Navigator.pushNamed(context, "/phone", arguments: {
      "appConfig": _configModel!.appConfig!,
      "closeVisitors": widget.closeVisitors,
      "sucReturn": widget.sucReturn,
      "onPage": widget.onPage,
    }).then((value) {
      if (mounted) {
        if (widget.sucReturn == SucReturnEnum.ret && value != null) {
          // Navigator.of(context).pop(value);
        } else {
          // 更新？
          setState(() {});
        }
      }
    });
  }

  /// 登录方法
  void _login() async {
    // 发送登录请求
    LoginDao.login(
      userAccount: "ssss",
      type: LoginTypeEnum.phone,
      token: _ydToken,
      accessToken: _accessToken,
    ).then((value) {
      // 关闭授权页
      quickLoginPlugin.closeLoginAuthView();
      _closeManual = true;
      // 登录成功，判断返回方法
      if (widget.sucReturn == SucReturnEnum.ret) {
        // 携带成功参数返回
        Navigator.of(context).pop(true);
      } else if (widget.sucReturn == SucReturnEnum.toPage) {
        // 跳转对应页面
        Navigator.pushReplacementNamed(context, widget.pageName);
      } else {
        // 登录成功，跳转首页
        if (IndustryDao.isInitExamKey()) {
          Navigator.pushNamedAndRemoveUntil(context, "/tab", (route) => false);
        } else {
          Navigator.pushNamedAndRemoveUntil(
              context, "/select-exam", (route) => false);
        }
        // Navigator.pushNamedAndRemoveUntil(context, "/tab",  (route) => false,);
      }
    }).catchError((e) {
      // 发生错误
      String msg = "未知错误，请重试";
      if (e is DaoException) {
        msg = e.msg;
      }
      ToastUtil.show(context: _context, msg: msg);
    });
  }

  /// ios登录方法
  void _iosLogin() {
    // 开启加载框
    ToastUtil.loadingBoxShow(_context);
    // 加载登录方法
    _appleLogin().then((Map<String, dynamic> map) {
      // 关闭加载框
      ToastUtil.loadingBoxRemove();
      if (map["success"]) {
        // 关闭授权页
        quickLoginPlugin.closeLoginAuthView();
        _closeManual = true;
        // 登录成功，判断返回方法
        if (widget.sucReturn == SucReturnEnum.ret) {
          // 携带成功参数返回
          Navigator.of(context).pop(true);
        } else if (widget.sucReturn == SucReturnEnum.toPage) {
          // 跳转对应页面

          Navigator.pushReplacementNamed(context, widget.pageName);
        } else {
          // 登录成功，跳转首页
          if (IndustryDao.isInitExamKey()) {
            Navigator.pushNamedAndRemoveUntil(
                context, "/tab", (route) => false);
          } else {
            Navigator.pushNamedAndRemoveUntil(
                context, "/select-exam", (route) => false);
          }
        }
      } else {
        // 登录失败
        ToastUtil.show(context: _context, msg: map["msg"]);
      }
    });
  }

  /// apple登录方法
  Future<Map<String, dynamic>> _appleLogin() async {
    Map<String, dynamic> map = {};
    try {
      final credential = await SignInWithApple.getAppleIDCredential(
        scopes: [
          AppleIDAuthorizationScopes.email,
          AppleIDAuthorizationScopes.fullName,
        ],
      );
      // 发送登录请求
      bool loginRes = await LoginDao.login(
        userAccount: "",
        type: LoginTypeEnum.iphone,
        credential: credential.identityToken,
      );

      map["success"] = loginRes;
      if (!loginRes) {
        map["msg"] = "未知错误，请重试";
      }
    } catch (e) {
      map = {"success": false, "msg": "未知错误，请重试"};
      if (e is DaoException) {
        map["msg"] = e.msg;
      }
    }
    return map;
  }

  /// 游客登录方法
  void _tourists() {
    // 关闭授权页
    quickLoginPlugin.closeLoginAuthView();
    _closeManual = true;
    if (widget.closeVisitors) {
      // 跳转首页
      Navigator.pushNamedAndRemoveUntil(
        context,
        "/tab",
        (route) => false,
      );
    } else {
      // 不是游客模式，直接返回
      Navigator.of(_context).pop();
    }
  }

  /// 条件不支持，跳转验证码登录页面
  void _pushPhone({
    String tipsMsg = "你手机不支持一键登录",
  }) {
    ToastUtil.show(context: _context, msg: tipsMsg);
    if (widget.sucReturn == SucReturnEnum.ret) {
      // 返回原页面单独处理
      Navigator.pushNamed(context, "/phone", arguments: {
        "appConfig": _configModel!.appConfig!,
        "closeVisitors": widget.closeVisitors,
        "sucReturn": widget.sucReturn,
        "onPage": widget.onPage,
      }).then((value) {
        Navigator.of(_context).pop(value);
      });
    } else {
      Navigator.pushReplacementNamed(context, "/phone", arguments: {
        "appConfig": _configModel!.appConfig!,
        "closeVisitors": widget.closeVisitors,
        "sucReturn": widget.sucReturn,
        "onPage": widget.onPage,
      });
    }
  }
}
